<?php

/*
 * Copyright 2008 the original author or authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#namespace tehframework\mvc\annotations;

#use tehframework\routing\StaticRoute;

class StaticMappingAnnotation extends RequestMappingAnnotation
{
	/**
	 * @var string
	 */
	protected $path;
	
	/**
	 * @var array<string=>mixed>
	 */
	protected $defs;
	
	/**
	 * @param  string $path
	 */
	public function __construct($path)
	{
		$this->setPath($path);
	}
	
	/**
	 * @param  array $state
	 * @return RequestMappingAnnotation
	 */
	public static function __set_state(array $state)
	{
		$annotation = new StaticMappingAnnotation($state['path']);
		$annotation->method  = $state['method'];
		$annotation->handler = $state['handler'];
		$annotation->defs    = $state['defs'];
		
		return $annotation;
	}
	
	/**
	 * @param  string $path
	 * @return StaticMappingAnnotation
	 */
	public function setPath($path)
	{
		$this->path = $path;
		
		return $this;
	}
	
	/**
	 * @param  array<string,mixed> $defs
	 * @return StaticMappingAnnotation
	 */
	public function setDefaults(array $defs)
	{
		$this->defs = $defs;
		
		return $this;
	}
	
	/**
	 * @return Route
	 */
	public function createRoute()
	{
		$route = new StaticRoute($this->path, $this->method, (array)$this->defs);
		$route->setHandler($this->handler);
		
		return $route;
	}
	
	/**
	 * Returns a bitwise flag of targets which can be annotated
	 * with this annotation.
	 * 
	 * @return int
	 *         A bitwise flag of method target. 
	 */
	public function getAnnotationTargets()
	{
		return Annotation::TARGET_METHOD;
	}
	
	/**
	 * Determines whether annotation can be used multiple times
	 * on a single target.
	 * 
	 * @return bool
	 *         Always FALSE. This annotation can not be used multiple times on
	 *         single target.
	 */
	public function allowsMultiple()
	{
		return false;
	}
	
	/**
	 * @return string
	 */
	public function serialize()
	{
		return serialize(array(
			$this->method, $this->handler, $this->path, $this->defs
		));
	}
	
	/**
	 * @param  string $serialized
	 */
	public function unserialize($serialized)
	{
		$unserialized = unserialize($serialized);
		
		$this->method  = $unserialized[0];
		$this->handler = $unserialized[1];
		$this->path    = $unserialized[2];
		$this->defs    = $unserialized[3];
	}
}